package org.finesys.ai.core;

import org.finesys.ai.core.search.SearchResponse;

import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.stream.Collectors;

class Utils {

    /**
     * 将Retrofit2响应转换为运行时异常。
     *
     * @param response Retrofit2响应对象
     * @return 转换为OpenAiHttpException的异常对象
     * @throws IOException 如果读取响应体时发生I/O错误
     */
    static RuntimeException toException(retrofit2.Response<?> response) throws IOException {
        return new OpenAiHttpException(response.code(), response.errorBody().string());
    }

    /**
     * 将OkHttp响应转换为自定义的OpenAiHttpException异常
     *
     * @param response OkHttp的响应对象
     * @return 返回一个OpenAiHttpException异常对象
     * @throws IOException 如果读取响应体时发生IO异常
     */
    static RuntimeException toException(okhttp3.Response response) throws IOException {
        return new OpenAiHttpException(response.code(), response.body().string());
    }

    /**
     * 获取给定值或默认值。
     *
     * @param <T>          值的类型
     * @param value        给定的值
     * @param defaultValue 默认值
     * @return 如果给定的值不为空，则返回该值；否则返回默认值
     */
    static <T> T getOrDefault(T value, T defaultValue) {
        return value != null ? value : defaultValue;
    }


    /**
     * 将用户输入的问题和搜索结果进行格式化输出。
     *
     * @param userMessage 用户输入的问题
     * @param values      搜索结果数组
     * @return 格式化后的字符串
     */
    public static String format(String userMessage, SearchResponse.Value[] values) {
        if (values == null || values.length == 0) {
            return userMessage;
        }
        String results = Arrays.stream(values).map(
                res -> String.format("Title:%s: \n Source:%s \n Content:%s \n Snippet: %s", res.getName(), res.getUrl(), res.getSummary(), res.getSnippet())
        ).collect(Collectors.joining("\n\n"));
        return String.format("用户输入提问: %s\n\n 当前时间:%s \n\n 参考如下内容进行推理回答:%s", userMessage,
                LocalDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME), results);
    }
}
